#include <iostream>
#include <cstdlib>
#include <omp.h>

#define N 1000000 // 必须是偶数

void init(int n, float *v1, float *v2)
{
#pragma omp parallel for
    for (int i = 0; i < n; ++i)
    {
        v1[i] = static_cast<float>(i + 1);
        v2[i] = static_cast<float>(i + 1);
    }
}

int main()
{
    int n = N;
    int chunk = 1000;

    // 使用动态内存分配避免栈溢出
    float *v1 = new float[n];
    float *v2 = new float[n];
    float *vavx = new float[n];

    init(n, v1, v2);

#pragma omp parallel num_threads(4) // 限定线程数
    {
// 第一段：前半部分乘法（并行执行）
#pragma omp for schedule(dynamic, chunk) nowait
        for (int i = 0; i < n / 2; ++i)
        {
            vavx[i] = v1[i] * v2[i];
        }

// 第二段：后半部分加法（与乘法并行执行）
#pragma omp for schedule(dynamic, chunk)
        for (int i = n / 2; i < n; ++i)
        {
            vavx[i] = v1[i] + v2[i];
        }
    }

    std::cout << "vavx[0]: " << vavx[0]
              << " vavx[" << N - 1 << "]: " << vavx[N - 1] << std::endl;

    delete[] v1;
    delete[] v2;
    delete[] vavx;
    return 0;
}